阅读指南
上一节做了需求分析和交互流程设计。本节进入技术选型阶段,解释为什么 Server 用 Node.js、Client 用 Python,以及项目的整体架构。
在开始动手之前,我们需要先回答一个关键问题:用什么语言来实现 MCP Server 和 Client?
首先要明确一点:MCP 协议本身是语言无关的。
回顾之前学习的通信机制:MCP 使用 JSON-RPC 2.0 作为通信协议,这是一个基于 JSON 的标准。只要一门语言能够:
它就可以实现 MCP Server 或 Client。
理论上的可能性
MCP Server 可以用:
• Node.js / TypeScript
• Python
• Go
• Rust
• Java
• C#
... 任何语言都行
MCP Client 也可以用:
• Python
• Node.js
• Go
• Rust
... 任何语言都行
虽然理论上可以用任何语言,但实际开发中,Node.js 是 MCP Server 的最佳选择:
1. 官方 SDK 支持最完善
Anthropic 官方提供的 @modelcontextprotocol/sdk 是 TypeScript/Node.js 实现的。使用官方 SDK 可以避免很多底层细节的坑。
2. 生态成熟
npm 上已经有大量现成的 MCP Server 可以参考:
@modelcontextprotocol/server-filesystem - 文件系统操作@modelcontextprotocol/server-postgres - PostgreSQL 数据库@modelcontextprotocol/server-github - GitHub 集成学习 Node.js 实现后,你可以快速理解和修改这些开源项目。
3. 异步 I/O 天然优势
MCP Server 需要处理大量的异步操作(读取文件、数据库查询、网络请求),Node.js 的事件循环模型非常适合这种场景。
对于 AI Client 的开发,Python 是更好的选择:
1. Python是大模型 生态的事实标准
2. 本书主语言
本书的其他章节(RAG、Agent、LangChain 等)都使用 Python,保持一致性可以降低学习成本。
3. Python 的 MCP Client SDK
虽然不如 Node.js 的 Server SDK 完善,但 Python 的 mcp 库已经足够好用:
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
# 非常简洁的 API
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
# 调用 MCP 能力
如果你是新手,看到要同时用两种语言可能会有点担心,但不用慌:
对于 Node.js 部分(Server):
对于 Python 部分(Client):
学习建议:
现在大部分代码已经不需要一行一行手写了,AI 编程助手可以帮你完成大部分重复工作(即 Vibe-Coding)。但这不代表可以完全甩手——最基础的能力是读懂 AI 生成了什么。尤其是涉及企业级或生产环境代码时,纯粹的 Vibe-Coding 几乎无法胜任,你必须自己理解代码逻辑,才能判断 AI 给出的方案是否合理,有问题的部分才能精准修正。
好在门槛比过去低了很多:不需要记住每个 API 的参数细节,只需要看明白思路——这里的整体架构是什么样的、数据怎么流转、Server 和 Client 怎么配合。剩下的细节交给 AI 去填充就行。
前面几节我们系统学习了 MCP 的理论知识——Resources、Tools、Prompts 三大核心能力,以及它们之间的通信机制。理论的最终目的是为了实践,现在让我们通过一个完整的项目来验证所学。
我们将实现一个游戏装备计算助手,它能够:
1. 查询装备属性(Resources)
2. 计算战斗数值(Tools)
3. 对比装备性能(Tools)
4. 生成分析报告(Prompts)
这个项目完整演示了 MCP 三大核心能力的实际应用。
项目目录结构
samples/chapter7/mcp_equipment/
├── README.md ← 完整技术文档(必读)
├── mcp-server/ ← MCP Server 实现
│ ├── index.js ← Server 主程序
│ ├── package.json ← Node.js 依赖配置
│ └── data/
│ └── equipments.json ← 装备数据
├── ai-client/ ← AI Client 实现
│ ├── main.py ← Client 主程序
│ └── requirements.txt ← Python 依赖配置
└── .env.example ← 环境变量示例
关于项目的技术架构、源码讲解、环境配置和运行方法,请参考源码目录中的 README.md。这份文档结合了前面章节的理论知识,详细解析了每个模块的实现原理。
到这里,我们已经完成了一个从零开始的 MCP Server 开发。但每次需要一个新能力,都要从头写一遍 MCP Server 吗?答案当然是否定的。MCP 协议最大的价值不在于造轮子,而在于用轮子——整个开源社区已经有大量现成的 MCP Server 可以直接使用。下一节将探讨如何快速找到并使用这些现成的 MCP Server,以及如何将自己开发的 MCP Server 发布出去。
| 中文 | English | 音标 | 说明 |
|---|---|---|---|
| 技术选型 | Technology Stack Selection | /tekˈnɑːlədʒi stæk sɪˈlekʃn/ | 根据场景选择合适的Server和Client开发语言的技术决策 |
| 语言无关性 | Language Agnosticism | /ˈlæŋɡwɪdʒ ˌæɡnɑːˈstɪsɪzəm/ | MCP协议不限制实现语言,任何能处理JSON的语言都可使用 |
| SDK 成熟度 | SDK Maturity | /es diː keɪ məˈtʃʊrəti/ | 官方SDK对特定语言的开发工具和类型支持的完善程度 |
| 跨语言通信 | Cross-Language Communication | /krɔːs ˈlæŋɡwɪdʒ kəˌmjuːnɪˈkeɪʃn/ | Server和Client用不同语言开发,通过标准协议互操作的能力 |